#include <vector>
#include <iostream>
using std::cout;
using std::endl;

template<class T>
class Node
{
public:
	Node(const T& data, Node<T>* nextPtr = nullptr); 
	// 初始化节点, 这个对于常节点很重要
	// 不加缺省参数的原因是为了在调用时,和上面哪一个进行区分
	// 常节点如果不连接节点将毫无意义,所以不加缺省参数也合理
	Node(const T& data, const Node<T>* nextPtr); 
	
	T m_data;
	Node<T>* m_nextPtr;
};

template<class T>
Node<T>::Node(const T& data, Node<T>* nextPtr)
	: m_data(data)
	, m_nextPtr(nextPtr)
{
	
}

template<class T>
Node<T>::Node(const T& data, const Node<T>* nextPtr)
	: m_data(data)
{
	m_nextPtr = (Node<T>*)nextPtr;
}


// 函数模版
template<class T>
const Node<T>* CreateConstList(const std::vector<T>& dataArray)
{
	
	const Node<T>* pcur = nullptr; 
	// const修饰*pcur, 既不能修改*pcur, 但pcur是可以修改的
	// const Node<T> 类型的指针类型就是在类型前加* -> const Node<T>*
	pcur = new const Node<T>(dataArray[dataArray.size()-1], pcur); // 最后一个节点
	const Node<T>* psuc = nullptr;
	for (int i = (int)dataArray.size()-2; i >= 0; i--)
	{
		psuc = new const Node<T>(dataArray[i], pcur);
		pcur = psuc;
	}
	
	return pcur;
}

void test_CreateConstList()
{
	std::vector<int> array;
	array.push_back(1);
	array.push_back(2);
	array.push_back(3);
	array.push_back(4);
	
	const Node<int>* phead = CreateConstList<int>(array);
	const Node<int>* pcur = phead;
	
	while (pcur != nullptr)
	{
		cout << pcur->m_data << endl;
		pcur = pcur->m_nextPtr;
		//pcur->m_data = 2;
	}
	
}

int main()
{
	test_CreateConstList();
	
	
	return 0;
}
